import cv2
import numpy as np

lenna = cv2.imread("data/00 (1).jpg")
#读取图片
#lenna为一个3维数组。具体代表含义如下
row, col, channel = lenna.shape  
#返回像素高度，像素宽度，和通道数一般为3

#用一个二维数组表示每一个点的灰度
lenna_gray = np.zeros((row, col))
for r in range(row):
    for l in range(col):
        lenna_gray[r, l] = 1 / 3 * lenna[r, l, 0] + 1 / 3 * lenna[r, l, 1] + 1 / 3 * lenna[r, l, 2]
#此方法为平均值法
#除此之外还有其他多种方式将彩色图处理为灰度图
 
lenna_gray[r, l] = 0.11 * lenna[r, l, 0] + 0.59 * lenna[r, l, 1] + 0.3 * lenna[r, l, 2]
#加权平均值法
lenna_binary = np.zeros_like(lenna_gray)
#zeros_like表示生成一个维度同lenna_gray一样的全为0的张量
threshold = 100
for r in range(row):
    for l in range(col):
        if lenna_gray[r, l] >= threshold:
            lenna_binary[r, l] = 255
        else:
            lenna_binary[r, l] = 0
 
cv2.imshow("lenna_binary", lenna_binary.astype("uint8"))
cv2.waitKey()
image = cv2.cvtColor(lenna, cv2.COLOR_RGB2GRAY)  	#二值化函数 
cv2.threshold(image, 140, 255, 0, image)  			#二值化函数 
result = cv2.blur(image,(5,5))
 
#上为均值模糊去噪方法。周围的都为均值
#又称为低通滤波
 
gaussianResult = cv2.GaussianBlur(image,(5,5),1.5)
 
#上为高斯模糊去噪方法。在某些情况下，需要对一个像素的周围的像素给予更多的重视。因此，可通过分配权重来重新计算这些周围点的值。
#(5,5)不可以随意指定，只能指定1,3,5,7.....等数字
result = cv2.medianBlur(image,5)